package com.itlong.cloud.property.service;


import com.itlong.cloud.POJO.DTO.property.PropertyUserInfoGetPageDTO;
import com.itlong.cloud.POJO.DTO.property.PropertyUserLoginDTO;
import com.itlong.cloud.POJO.DTO.property.PropertyUserSaveDTO;
import com.itlong.cloud.POJO.PO.PropertyUserInfoPO;
import com.itlong.cloud.POJO.VO.MessageVO;
import com.itlong.cloud.POJO.VO.property.*;
import com.itlong.cloud.utils.page.Page;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      物业-人员信息业务处理接口
 * </desc>
 *
 * @createDate 2017/10/13
 */
public interface IPropertyUserService {

    /**
     * <desc>
     *      物业用户登录时校验用户
     * <desc/>
     * @param   propertyUserInfoPO  登录成功的物业人员信息
     * @return  PropertyUserLoginCheckVO  物业登录校验DTO
     * @author Biao.R
     * @createDate 2017/10/13
     */
    PropertyUserLoginCheckVO getLoginDetail(PropertyUserInfoPO propertyUserInfoPO) throws UnsupportedEncodingException;

    /**
     * <desc>
     *      物业注销
     * <desc/>
     * @param   propertyUserLoginDTO    物业登出校验DTO
     * @return
     * @author Biao.R
     * @createDate 2017/10/16
     */
    PropertyUserCacheVO logout(PropertyUserLoginDTO propertyUserLoginDTO);

    /**
     * <desc>
     *      物业用户请求时校验通过token校验用户
     * <desc/>
     * @param   loginUserId  登录用户ID
     * @param   token  登录用户ID
     * @return  PropertyUserLoginCheckVO  物业登录校验DTO
     * @author Biao.R
     * @createDate 2017/10/17
     */
    PropertyUserCacheVO checkCacheUser(String loginUserId, String token);

    /**
     * <desc>
     *      根据条件查询人员是否存在 true为存在 false不存在
     * </desc>
     * @param    params  查询参数
     * @return  是否存在  true为存在 false不存在
     * @author Biao.R
     * @createDate 2017/10/13
     *
     */
    boolean isPropertyUserExist(Map<String, Object> params);

    /**
     * <desc>
     *      获取分页数据
     * </desc>
     *
     * @param pageDTO   参数DTO
     * @return
     * @author Biao.R
     * @createDate 2017/10/16
     */
    Page<PropertyUserInfoGetUserPageVO> getPage(PropertyUserInfoGetPageDTO pageDTO);


    /**
     * <desc>
     *      保存人员
     * </desc>
     *
     * @param propertyUserInfoPO 人员实体
     * @return
     * @author Biao.R
     * @createDate 2017/09/27
     */
    Integer save(PropertyUserSaveDTO propertyUserInfoPO) throws Exception;

    /**
     * <desc>
     *      更新人员
     * </desc>
     *
     * @param propertyUserInfoPO 人员实体
     * @return
     * @author Biao.R
     * @createDate 2017/09/27
     */
    Integer update(PropertyUserSaveDTO propertyUserInfoPO) throws Exception;

    /**
     * <desc>
     *      根据条件查询人员
     * </desc>
     * @param    params  查询参数
     * @return  List<PropertyUserInfoPO> 人员实体集合
     * @author Biao.R
     * @createDate 2017/10/13
     *
     */
    List<PropertyUserInfoPO> getList(Map<String, Object> params);

    /**
     * <desc>
     *      根据id查询人员
     * </desc>
     *
     * @param propertyUserInfoPO 人员实体
     * @return
     * @author Biao.R
     * @createDate 2017/10/17
     */
    PropertyUserInfoGetOneVO getOne(PropertyUserInfoPO propertyUserInfoPO);


    /**
     * <desc>
     *      删除用户
     * </desc>
     *
     * @param userIds 用户id数组
     * @return sql执行行数
     * @author Biao.R
     * @createDate 2017/10/17
     */
    Integer delete(String userIds);

    /**
     * <desc>
     *      重置用户密码
     * </desc>
     *
     * @param userIds 用户id数组
     * @return
     * @author Biao.R
     * @createDate 2017/10/17
     */
    Integer resetPassword(String userIds);

    /**
     * <desc>
     *      修改密码
     * </desc>
     *
     * @param userName 用户名
     * @param password 密码
     * @param newPassword 新密码
     * @return
     * @author Biao.R
     * @createDate 2017/10/13
     */
    Integer updatePassword(String userName,String password,String newPassword) throws Exception;


    /**
     * <desc>
     *      根据项目ID获取该项目的物业管理员userId
     * <desc/>
     * @param  projectId  待查询的项目ID
     * @return String   物业管理员userId
     * @author Biao.R
     * @createDate 2017/11/9
     */
    String getPropertyAdmin(String projectId);

    /**
     * <desc>
     *      更新property_user_info单表
     * <desc/>
     * @param   userInfoPO   待更新对象
     * @return 更新数量
     * @author Biao.R
     * @createDate 2017/11/13
     */
    Integer updateUser(PropertyUserInfoPO userInfoPO);

    /**
     * <desc>
     *      根据项目编号和项目物业管理员密码校验登录用户
     * <desc/>
     * @param  param    校验参数
     * @return  查询到的用户信息
     * @author Biao.R
     * @createDate 2017/12/10
     */
    PropertyUserInfoPO checkUserByProjectId(Map<String, Object> param);

    /**
     * <desc>
     *      根据物业帐号和密码校验登录用户
     * <desc/>
     * @param  param    校验参数
     * @return  查询到的用户信息
     * @author Biao.R
     * @createDate 2017/12/10
     */
    PropertyUserInfoPO checkUserByUserName(Map<String, String> param);

    /**
     * <desc>
     *      查询物业用户所属项目信息
     * <desc/>
     * @param  userId   待查询用户userId
     * @return 查询到的项目状态信息
     * @author Biao.R
     * @createDate 2017/12/11
     */
    List<Integer> getProjectByUserId(String userId);


    /**
     * <desc>
     *      物业登陆错误处理
     * <desc/>
     * @param   propertyUserLoginDTO    登录用户DTO
     * @return  标准化响应结果
     * @author Biao.R
     * @createDate 2017/12/15
     */
    MessageVO loginErrorHandler(PropertyUserLoginDTO propertyUserLoginDTO);

    /**
     * <desc>
     *      检查账号是否被锁定
     * <desc/>
     * @param  account  检查的账号
     * @return  标准化响应结果
     * @author Biao.R
     * @createDate 2017/12/15
     */
    MessageVO getAccountLockDetail(String account);

    /**
     * <desc>
     *      根据电梯cardId查询userId
     * </desc>
     *
     * @param cardId
     * @return
     * @author Jiaqi.X
     * @createDate 2018/03/25
     */
    String getUserIdByCardId(String cardId);

    /**
     * <desc>
     *     登录成功后根据userid查询当前用户下的小区信息
     * <desc/>
     *@param loginUserId
     * @return  MessageVO 标准格式化响应结果
     * @author JuGuang.S
     * @createDate 2018/07/04
     */
    List<PropertyProjectRoleVO> getUserProjectInfo(String loginUserId);

    /**
     * <desc>
     *      由项目id查询物业名称
     * </desc>
     *
     * @param projectId 项目id
     * @return 物业名称
     * @author wangzhi
     * @createDate 2018/08/31
     */
    String getPropertyNameByProjectId(String projectId) throws Exception;

    /**
     * <desc>
     *      由身份证序列号查询用户信息
     * </desc>
     *
     * @param idCardKey 身份证序列号
     * @return 用户信息
     * @author wangzhi
     * @createDate 2019/02/28
     */
    Map<String,Object> getUserInfoByIdCardKey(String idCardKey,String projectId) throws Exception;

    /**
     * <desc>
     *      找回密码时，通过账号获取绑定手机号
     * <desc/>
     *
     * @return 相关参数
     * @author wangzhi
     * @createDate 2019/12/25
     */
    Map<String,Object> getPhoneNumByUserName(String userName) throws Exception;

    /**
     * <desc>
     *      根据用户id查询一个用户
     * <desc/>
     * @param  userId    用户id
     * @return  PropertyUserInfoPO
     * @author zhouchun
     * @createDate 2021-05-31
     */
    PropertyUserInfoPO getByUserId(String userId);

}
